#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<assert.h>
//int main()
//{ 
//  pid_t id=fork();
//  if(id==0)
//  {
//    int cnt=5;
//    while(1)
//    {
//      printf("我是子进程，I am alive ,I have %dS,pid:%d,ppid:%d\n",cnt--,getpid(),getppid());
//      sleep(1);
//    
//    }
//    exit(123);
//  }
//  sleep(10);
//  //父进程
//  int sta;
//  pid_t ret_id=waitpid(id, &sta,WNOHANG);
//  if(ret_id==0)
//  {
//    printf("still waiting\n");
//  }
//  if(ret_id>0)
//  {
//  printf(" 我是父进程 ， I am waiting ,pid:%d ,ppid:%d,ret_id:%d,对出码：%d,终止信号:%d\n",getpid(),getppid(),ret_id,WEXITSTATUS(sta),sta&0x7f);
//  sleep(5);
//  }
//  if(ret_id<0)
//  {
//    printf("wait error\n");
//  }
//media
//  return 0;
//}
//命令行解释器，执行用户输入指令，不退出，并一直打印提示符
//获取命令,创建子进程经行程序替换

#define Max 1024
#define ARGC 64
#define SEP " "
int split(char* commandstr,char* argv[])
{
  assert(commandstr);
  assert(argv);
  argv[0]=strtok(commandstr,SEP);//strtok（）拆分字符串
  if(argv[0]==NULL) return -1;
  int i=1;
  while((argv[i++]=strtok(NULL,SEP)));
  return 0;
}
void showEnv()
{
  extern char **environ;
  int i=0;
  for(i=0;environ[i];i++)
  {
    printf("%d:%s\n",i,environ[i]);

  }
}
int main()
{
  char myenv[32][256];
  int env_index=0;
  while(1)
  {
    char commandstr[Max]={0};
    char *argv[ARGC]={NULL};
    //打印提示符不换行，刷新缓冲区
    printf("[wzy@lilvic curpath]# ");
    fflush(stdout);
    //fgets（）获取输入字符串
    char* s=fgets(commandstr,sizeof(commandstr),stdin);
    assert(s);
    (void)s;
    //输入最后要回车，最后一个字符是‘\n，将其改为'\0'
    commandstr[strlen(commandstr)-1]='\0';
    //字符串拆分，放入argcv
    int n=split(commandstr,argv);
    if(n!=0) continue;
    //cd内建命令在父进程执行
    if(strcmp(argv[0],"cd")==0)
    {
      if(argv[1]!=NULL) chdir(argv[1]);//chdir：更改工作路径
      continue;
    }
    //export
    //关于环境变量的命令几乎都是内建命令
    else if(strcmp(argv[0],"export")==0)
    {
      if(argv[1]!=NULL)
      {
        strcpy(myenv[env_index],argv[1]);
        putenv(myenv[env_index++]);
      }
      continue;
    }
    else if(strcmp(argv[0],"env")==0)
    {
      showEnv();
      continue;
    }
    else if(strcmp(argv[0],"echo")==0)
    {
      //echo $PATH
      const char *target_env=NULL;
      if(argv[1][0]=='$')
      {
        target_env=getenv(argv[1]+1);


      }
      if(target_env!=NULL)
      {
        printf("%s=%s\n",argv[1]+1,target_env);
      }
      continue;
    }
    
    //ls配色
    if(strcmp(argv[0],"ls")==0)
    {
      int pos=0;
      while(argv[pos]!=NULL)
      {
        pos++;
      }
      argv[pos++]=(char*)"--color=auto";
      argv[pos]=NULL;

    }
    //创建子进程执行命令
    pid_t id=fork();
    assert(id>=0);
    (void)id;
    if(id==0)
    {
      //程序替换
      execvp(argv[0],argv);
      exit(-1);
    }
    int status=0;
    waitpid(id,&status,0);
  }



}
